package de.kroesch.clt.scripting;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import de.kroesch.clt.Command;
import de.kroesch.clt.Environment;
import de.kroesch.clt.HasArguments;
import de.kroesch.clt.InternalEnvironment;
import de.kroesch.clt.UserHelp;
/**
* Reads and executes CLT (terminal batch) or JS (Javascript) files.
*
* @author karsten
*
*/
public class Load implements Command, HasArguments, UserHelp {
private Environment environment;
private List<String> args;
public void run() {
if (0 == args.size()) {
environment.writer().printf("Usage: \n%s\n", help());
return;
}
String file = args.get(0);
if (file.endsWith(".js")) {
evaluateJavascript(file);
return;
}
if (! file.endsWith(".clt")) {
environment.writer().printf("Unknown extension for file %s.\n", file);
return;
}
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
Runnable command = ((InternalEnvironment)environment).parser().parseCommand(line);
command.run();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void setEnvironment(Environment env) {
this.environment = env;
}
public String toString() {
return "load " + args;
}
public void setArguments(List<String> args) {
this.args = args;
}
public String help() {
return "load FILE.[js|clt] - Reads and executes CLT (terminal batch) or JS (Javascript) files.";
}
private void evaluateJavascript(String file) {
// JavaScript
ScriptEngineManager engineMgr = new ScriptEngineManager();
ScriptEngine engine = engineMgr.getEngineByName("JavaScript");
try {
InputStream is = new FileInputStream(file);
Reader reader = new InputStreamReader(is);
engine.eval(reader);
} catch (ScriptException ex) {
environment.writer().print(ex);
throw new RuntimeException(ex);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}